﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Reflection;

namespace RG.Common.Configuration
{
    [AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
   public abstract class BaseSettingsAttribute:Attribute
    {
        public string Name { get; set; }
        public object DefaultValue { get; set; }
        public bool SaveNullValue { get; set; }
        //note - пока что на совести программист лежит необходимость прописывать его в SettingsSerializeAs.XML для тех свойств которые ReferenceType
        public SettingsSerializeAs SerializeAs { get; set; }
        /// <summary>
        ///Собираем все сеттинги 
        /// </summary>
        /// <param name="obj">Объект  к которому относится это property </param>
        /// <param name="objID">Дополнительный айдишник используемый при завнии имени сеттинга для того чтобы отличить два сеттинга объектов одного типа</param>
        /// <param name="pi">Свойство объекта на котором висит данный атрибут</param>
        /// <returns></returns>
        public abstract IEnumerable<ISetting> Collect(object obj, string objID, PropertyInfo pi);

        protected BaseSettingsAttribute()
        {
            SerializeAs = SettingsSerializeAs.String;
        }
    }
}
